#include "TestSerializacionBloquesArbol.h"

#include "includes.h"
#include "../src/indices/arbol/BloqueInterno.h"
#include "../src/indices/arbol/BloqueHoja.h"
#include "../src/estrategiaRecurso/Archivo.h"
#include "../src/FuncionesUtiles.h"
#include "../src/indices/arbol/Arbol.h"

TestSerializacionBloquesArbol::TestSerializacionBloquesArbol() {


}

TestSerializacionBloquesArbol::~TestSerializacionBloquesArbol() {

}


void TestSerializacionBloquesArbol::run() {

	this->testSerializacionInterno();
	this->testSerializacionHoja();
	this->testCalculoTamanioBloque();
}


void TestSerializacionBloquesArbol::testSerializacionHoja() {

	offset id = 132132;
	offset padre = 542;

	system("rm ./Archivos/Hoja");
	Archivo archivo("./Archivos/Hoja");

	TipoClaveString *extractor = new TipoClaveString();

	Arbol arbol("arbol",extractor,20,2);

	BloqueHoja hoja(&arbol,1024,extractor);

	hoja.setId(id);
	hoja.setPadre(padre);
	hoja.setHermano(51);

	hoja.getClaves().push_back(Key(new ClaveString("Pepe")));
	hoja.getClaves().push_back(Key(new ClaveString("Gonza")));
	hoja.getClaves().push_back(Key(new ClaveString("Yuli")));
	hoja.getClaves().push_back(Key(new ClaveString("Coco")));
	hoja.getClaves().push_back(Key(new ClaveString("Seba")));
	hoja.getClaves().push_back(Key(new ClaveString("Chaja")));
	hoja.getClaves().push_back(Key(new ClaveString("Chuchu")));
	hoja.getClaves().push_back(Key(new ClaveString("Hola")));

	hoja.getPunteros().push_back(0);
	hoja.getPunteros().push_back(1);
	hoja.getPunteros().push_back(2);
	hoja.getPunteros().push_back(3);
	hoja.getPunteros().push_back(4);
	hoja.getPunteros().push_back(5);
	hoja.getPunteros().push_back(6);
	hoja.getPunteros().push_back(7);
	hoja.getPunteros().push_back(8);
	hoja.getPunteros().push_back(9);

	Bytes serializacionHoja = hoja.serializarse();

	BloqueHoja hoja2(&arbol,0,extractor);

	hoja2.hidratarse(serializacionHoja);

	assert(hoja.getPadre() == hoja2.getPadre(), "Test Get Padre Bloque Interno");
	assert(hoja.getId() == hoja2.getId(), "Test Get Id Bloque Interno");
	assert(hoja.getTipo() == hoja2.getTipo(), "Test Get Tipo");
	assert(hoja.getSiguiente() == hoja2.getSiguiente(), "Test Get Siguiente");
	assert(1024 == hoja2.getTamanio(),"Test Tamanio");

	vector<Key>::iterator itClaves = hoja.getClaves().begin();
	vector<Key>::iterator itClaves2 = hoja2.getClaves().begin();

	for ( ; itClaves != hoja.getClaves().end(); itClaves++) {
		assert((*itClaves) == (*itClaves2),"Test Interno, Clave: " + (*itClaves).toString());

		itClaves2++;
	}

	vector<offset>::iterator itPunteros = hoja.getPunteros().begin();
	vector<offset>::iterator itPunteros2 = hoja2.getPunteros().begin();

	for ( ; itPunteros != hoja.getPunteros().end(); itPunteros++) {

		stringstream ss;
		ss << (*itPunteros);

		assert((*itPunteros) == (*itPunteros2), "Test Interno, offset: " + ss.str());
		itPunteros2++;
	}


	delete extractor;
}


void TestSerializacionBloquesArbol::testSerializacionInterno() {

	offset id = 132132;
	offset padre = 542;
	system("rm ./Archivos/Interno");
	Archivo archivo("./Archivos/Interno");

	TipoClaveString *extractor = new TipoClaveString();
	Arbol arbol("arbol",extractor,20,2);

	BloqueInterno interno(&arbol,1024,extractor);

	interno.setId(id);
	interno.setPadre(padre);

	interno.getClaves().push_back(Key(new ClaveString("Pepe")));
	interno.getClaves().push_back(Key(new ClaveString("Gonza")));
	interno.getClaves().push_back(Key(new ClaveString("Yuli")));
	interno.getClaves().push_back(Key(new ClaveString("Coco")));
	interno.getClaves().push_back(Key(new ClaveString("Seba")));
	interno.getClaves().push_back(Key(new ClaveString("Chaja")));
	interno.getClaves().push_back(Key(new ClaveString("Chuchu")));
	interno.getClaves().push_back(Key(new ClaveString("Hola")));

	interno.getPunteros().push_back(0);
	interno.getPunteros().push_back(1);
	interno.getPunteros().push_back(2);
	interno.getPunteros().push_back(3);
	interno.getPunteros().push_back(4);
	interno.getPunteros().push_back(5);
	interno.getPunteros().push_back(6);
	interno.getPunteros().push_back(7);
	interno.getPunteros().push_back(8);
	interno.getPunteros().push_back(9);

	Bytes serializacion = interno.serializarse();
	archivo.escribir(serializacion,0);

	BloqueInterno interno2(&arbol,0,extractor);

	interno2.hidratarse(serializacion);

	assert(interno.getPadre() == interno2.getPadre(), "Test Get Padre Bloque Interno");
	assert(interno.getId() == interno2.getId(), "Test Get Id Bloque Interno");
	assert(interno.getTipo() == interno2.getTipo(), "Test Get Tipo");

	cout << "tamanio " << interno.getTamanio();

	assert(interno.getTamanio() == interno2.getTamanio(),"Test Tamanio ");
	vector<Key>::iterator itClaves = interno.getClaves().begin();
	vector<Key>::iterator itClaves2 = interno2.getClaves().begin();

	for ( ; itClaves != interno.getClaves().end(); itClaves++) {
		assert((*itClaves) == (*itClaves2),"Test Interno, Clave: " + (*itClaves).toString());

		itClaves2++;
	}

	vector<offset>::iterator itPunteros = interno.getPunteros().begin();
	vector<offset>::iterator itPunteros2 = interno2.getPunteros().begin();

	for ( ; itPunteros != interno.getPunteros().end(); itPunteros++) {

		stringstream ss;
		ss << (*itPunteros);

		assert((*itPunteros) == (*itPunteros2), "Test Interno, offset: " + ss.str());
		itPunteros2++;
	}

	delete extractor;
}

void TestSerializacionBloquesArbol::testCalculoTamanioBloque() {

	cantBytes tamanio = BloqueArbol::calcularTamanio(5,4);

	TipoClaveString *extractor = new TipoClaveString();
	Arbol arbol("arbol",extractor,20,2);

	BloqueInterno interno(&arbol,tamanio,extractor);

	BloqueHoja hoja(&arbol,tamanio,extractor);

	interno.getClaves().push_back(Key(new ClaveString("pepe")));
	interno.getClaves().push_back(Key(new ClaveString("pepe")));
	interno.getClaves().push_back(Key(new ClaveString("pepe")));
	interno.getClaves().push_back(Key(new ClaveString("pepe")));
	interno.getClaves().push_back(Key(new ClaveString("pepe")));

	interno.getPunteros().push_back(1);
	interno.getPunteros().push_back(1);
	interno.getPunteros().push_back(1);
	interno.getPunteros().push_back(1);
	interno.getPunteros().push_back(1);
	interno.getPunteros().push_back(1);

	hoja.getClaves().push_back(Key(new ClaveString("pepe")));
	hoja.getClaves().push_back(Key(new ClaveString("pepe")));
	hoja.getClaves().push_back(Key(new ClaveString("pepe")));
	hoja.getClaves().push_back(Key(new ClaveString("pepe")));
	hoja.getClaves().push_back(Key(new ClaveString("pepe")));

	hoja.getPunteros().push_back(1);
	hoja.getPunteros().push_back(1);
	hoja.getPunteros().push_back(1);
	hoja.getPunteros().push_back(1);
	hoja.getPunteros().push_back(1);
	hoja.getPunteros().push_back(1);

	assert(tamanio == hoja.serializarse().getTamanio(),"Test Tamanio Hoja");
	assert(tamanio == interno.serializarse().getTamanio(),"Test Tamanio Interno");
}
